package 力扣进阶面试题;

import java.util.HashMap;

class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }

}


public class p138复制带随机指针的链表 {
    public Node copyRandomList(Node head) {
        //注意！！！ 复制出的链表 结构一样，但next random中的引用值不一样
        if (head==null) return null;
        Node cur=head;
        HashMap<Node,Node> map=new HashMap<>();

        //先按照原链表的结点创建相同的结点 以及 填入val
        while (cur!=null) {
            Node node=new Node(cur.val);
            map.put(cur,node);
            cur=cur.next;
        }

        cur=head;
        //按照原链表中的结构，对新链表结构进行相同的构建
        while (cur!=null) {
            map.get(cur).next=map.get(cur.next);
            //get(cur).next 获取cur结点对应的val(新链表的结点)，再对val的next进行赋值
            //get(cur.next) 获取cur的next结点对应的val，将这个值赋值给左边
            map.get(cur).random=map.get(cur.random);
        }

        return map.get(head);//返回新链表的头结点
    }
}
